#include "ConnectionAcceptingThread.h"

#include <syslog.h>

ConnectionAcceptingThread::ConnectionAcceptingThread(int p){
	port = p;
}

ConnectionAcceptingThread::~ConnectionAcceptingThread(){}

void ConnectionAcceptingThread::run(){
	try{
		int socketCliente;
		// Inicializo el socket para aceptar conexiones.
		socket.setAddr_in(port, NULL);
		int retorno = socket.escucharPuerto(port);
		if (retorno != 0);
		// Hago toda la estructura del server para aceptar clientes.
		struct sockaddr_in clienteAux;
		while (running){
			socketCliente = socket.aceptarCliente(clienteAux, sizeof(clienteAux));
			if (socketCliente == -1) {
				break;
			}
			UsuarioSinIdentificar * usr = new UsuarioSinIdentificar(socketCliente, usuarios);
			usr->start();
			usuarios.push_back(usr);
		};

		// Cierro todas las conexiones y finalizo el server.
		usuarios.lock();
		std::list<Usuario*>::iterator iterador = usuarios.begin();
		//std::cout << "el nombre es: " << (*iterador)->obtenerNombre() << std::endl;
		std::list<Usuario*>::iterator fin = usuarios.end();
		while (iterador != fin){
			(*iterador)->esperarDesconexion();
			(*iterador)->join();
			delete(*iterador);
			++iterador;
		};
		usuarios.unlock();
	}catch(std::exception &e){
		std::cout << e.what() << std::endl;
		syslog(LOG_ERR, "El programa se ha cerrado inesperadamente: %s ", e.what());
	}
}

void ConnectionAcceptingThread::stop(){
	this->running = false;
	this->socket.cerrarSocket();
}
